package Estats;

import Config.ArchivoConfiguracion;
import java.util.ArrayList;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;
import org.newdawn.slick.gui.AbstractComponent;
import org.newdawn.slick.gui.ComponentListener;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
import GUI.BotoMenu;
import factoryTotal.EstatJuego0;
import factoryTotal.EstatJuego1;
import factoryTotal.EstatJuego2;
import newMenu.ManagerRecursos;
import newMenu.ManagerPerfil;

/**
 * Es mostra el Menu Principal on l'usuari pot escollir en quina opció del menu
 * entrar
 * @author David Alvarez Palau i Ernest Daban Macià
 */
public class EstatAvion3 extends BasicGameState {

    // Identificador del estat
    public static final int ID = 7;
    // Contenidor del joc
    private GameContainer container;
    // Contenidor d'estats que s'usara per accedir als estats necessaris
    private StateBasedGame state;
    // Boto per continuar jugant des de l'ultim punt on es va deixar el joc
    private BotoMenu botoJugar;
    // Boto per accedir al menu opcions
    private BotoMenu botoAvioMes;
    // Boto per accedir a l'estat canviar perfil per canviar el perfil actiu d'usuari
    private BotoMenu botoAvioMenys;
    // boton volver
    private BotoMenu botoVolver;
    private boolean alphaBotonsIn;
    // Boolean que s'utilitza per comprovar si s'ha de realitzar transparencia
    private boolean alphaBotonsOut;
    // ArrayList per moure tots els botons quan sigui necessari
    private ArrayList<BotoMenu> botons;
    // Comptador per realitzar moviment en els botons
    private int comptador;
    // Indica a quin estat s'ha de canviar
    private int cambioA;
    // Float per utilitzar en alpha bending
    private float transparencia;
    // Imatge del fons de pantalla
    private Image imatgeFons;
    // Imatge del fons de pantalla CAT
    private Image imatgeFonsCat;
    // Imatge del fons de pantalla ENG
    private Image imatgeFonsEng;
    // Image amb el logotip del joc
    private Image imatgeTitol;
    // Imatge del boto normal (Sense mouse over)
    private Image imatgeBotoNormal;
    // Image del boto amb mouse over
    private Image imatgeBotoOver;
    // Imatge del boto Play
    private Image imatgeBotoPlay;
    // Imatge del boto Over Play
    private Image imatgeBotoOverPlay;
    // Imatge del text Jugar del boto
    private Image imatgeTextJugar;
    // Imatge del text Jugar del boto CAT
    private Image imatgeTextJugarCat;
    // Imatge del text Jugar del boto ENG
    private Image imatgeTextJugarEng;
    // Imatge del text Perfil del boto
    private Image imatgeTextAnterior;
    // Imatge del text dades
    private Image imatgeTextSiguiente;
    // Imatge del text Perfil del boto CAT
    private Image imatgeTextAnteriorCat;
    // Imatge del text dades CAT
    private Image imatgeTextSiguienteCat;
    // Imatge del text Perfil del boto ENG
    private Image imatgeTextAnteriorEng;
    // Imatge del text dades ENG
    private Image imatgeTextSiguienteEng;
    //Imatge text sonidos
    private Image imatgeTextSo;
    // Imatge del text Sortir del boto
    private Image imatgeTextVolver;
    // Imatge del text Sortir del boto CAT
    private Image imatgeTextVolverCat;
    // Imatge del text Sortir del boto ENG
    private Image imatgeTextVolverEng;
    // So del click que fan els botons al fer un mouse clicked
    private Sound soClick;
    // So del mouse que fan els botons pel mouse over
    private Sound soOver;
    //Imagen mision nivel 2
    private Image imatgeFonsNivel2;
    //Imagen mision nivel 3
    private Image imatgeFonsNivel3;
    //Idioma perfil
    private int idioma;

    /**
     * BasicGameState ens obliga a implementar aquest metode
     * @return int amb l'ID de l'estat del joc
     */
    public int getID() {
        return ID;
    }

    /**
     * Aqui s'inicialitzen les variables necessaries per al correcte funcionament del estat
     * @param container
     * @param game
     * @throws SlickException
     */
    public void init(GameContainer container, StateBasedGame state) {
        this.container = container;
        this.state = state;
        imatgeFons = ManagerRecursos.getImage("fondoAvion3EspImage");
        imatgeFonsCat = ManagerRecursos.getImage("fondoAvion3CatImage");
        imatgeFonsEng = ManagerRecursos.getImage("fondoAvion3EngImage");
        imatgeBotoOver = ManagerRecursos.getImage("botoPetitImage");
        imatgeBotoNormal = ManagerRecursos.getImage("botoPetitOverImage");
        imatgeTextJugar = ManagerRecursos.getImage("textJugarImage");
        imatgeTextAnterior = ManagerRecursos.getImage("textAnteriorImage");
        imatgeTextSiguiente = ManagerRecursos.getImage("textSeguentImage");
        imatgeTextJugarCat = ManagerRecursos.getImage("textJugarCatImage");
        imatgeTextAnteriorCat = ManagerRecursos.getImage("textAnteriorImage");
        imatgeTextSiguienteCat = ManagerRecursos.getImage("textSeguentCatImage");
        imatgeTextAnteriorEng = ManagerRecursos.getImage("textAnteriorEngImage");
        imatgeTextSiguienteEng = ManagerRecursos.getImage("textSeguentEngImage");
        imatgeTextJugarEng = ManagerRecursos.getImage("textJugarEngImage");
        imatgeTextVolver = ManagerRecursos.getImage("textTornarEspImage");
        imatgeTextVolverCat = ManagerRecursos.getImage("textTornarCatImage");
        imatgeTextVolverEng = ManagerRecursos.getImage("textTornarEngImage");
        soClick = ManagerRecursos.getSound("clickSound");
        soOver = ManagerRecursos.getSound("overSound");
    }

    /**
     * Es reinicia el valor de les variables usades en aquest estat
     */
    private void reiniciarVariables() {
        botons = new ArrayList<BotoMenu>();
        cambioA = 0;
    }

    /**
     * En aquest metode es creen els botons que es mostraran en el menu principal
     * A través del manager de recursos assignem una imatge i una posicio als botons
     */
    private void crearBotonsMenuNormal() {
        // BotoMenu nova partida
        botoJugar = new BotoMenu(container, imatgeBotoNormal, container.getWidth() - 265, 540);
        botoJugar.setMouseOverImage(imatgeBotoOver);
        if (idioma == 1) {
            botoJugar.setImageText(imatgeTextJugar);
        } else if (idioma == 2) {
            botoJugar.setImageText(imatgeTextJugarCat);
        } else if (idioma == 3) {
            botoJugar.setImageText(imatgeTextJugarEng);
        }
        botoJugar.setMouseDownSound(soClick);
        botoJugar.setMouseOverSound(soOver);
        botons.add(botoJugar);
        // BotoMenu menu opcions
        botoAvioMes = new BotoMenu(container, imatgeBotoNormal, 500, 690);
        botoAvioMes.setMouseOverImage(imatgeBotoOver);
        if (idioma == 1) {
            botoAvioMes.setImageText(imatgeTextSiguiente);
        } else if (idioma == 2) {
            botoAvioMes.setImageText(imatgeTextSiguienteCat);
        } else if (idioma == 3) {
            botoAvioMes.setImageText(imatgeTextSiguienteEng);
        }
        botoAvioMes.setMouseDownSound(soClick);
        botoAvioMes.setMouseOverSound(soOver);
        botons.add(botoAvioMes);
        // BotoMenu canvi de perfil
        botoAvioMenys = new BotoMenu(container, imatgeBotoNormal,  10, 690);
        botoAvioMenys.setMouseOverImage(imatgeBotoOver);
        if (idioma == 1) {
            botoAvioMenys.setImageText(imatgeTextAnterior);
        } else if (idioma == 2) {
            botoAvioMenys.setImageText(imatgeTextAnteriorCat);
        } else if (idioma == 3) {
            botoAvioMenys.setImageText(imatgeTextAnteriorEng);
        }
        botoAvioMenys.setMouseDownSound(soClick);
        botoAvioMenys.setMouseOverSound(soOver);
        botons.add(botoAvioMenys);
        // BotoMenu canvi de perfil
        botoVolver = new BotoMenu(container, imatgeBotoNormal, container.getWidth() - 265, 600);
        botoVolver.setMouseOverImage(imatgeBotoOver);
        if (idioma == 1) {
            botoVolver.setImageText(imatgeTextVolver);
        } else if (idioma == 2) {
            botoVolver.setImageText(imatgeTextVolverCat);
        } else if (idioma == 3) {
            botoVolver.setImageText(imatgeTextVolverEng);
        }
        botoVolver.setMouseDownSound(soClick);
        botoVolver.setMouseOverSound(soOver);
        botons.add(botoVolver);


    }

    /**
     * S'afegeixen els listeners que faran accionar els botons
     */
    private void afegirListeners() {
        botoJugar.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                if (!alphaBotonsIn && !alphaBotonsOut) {
                    alphaBotonsOut = true;
                    ManagerPerfil.setNave(3);
                    if (ManagerPerfil.getNivel() == 1) {
                        cambioA =  EstatJuego0.ID;
                    } else if (ManagerPerfil.getNivel() == 2) {
                        cambioA =  EstatJuego1.ID;
                    } else if (ManagerPerfil.getNivel() == 3) {
                        cambioA =  EstatJuego2.ID;
                    }
                }
            }
        });
        botoAvioMes.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                if (!alphaBotonsIn && !alphaBotonsOut) {
                    alphaBotonsOut = true;
                    cambioA = EstatAvion1.ID;
                }
            }
        });
        botoAvioMenys.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                if (!alphaBotonsIn && !alphaBotonsOut) {
                    alphaBotonsOut = true;
                    cambioA = EstatAvion2.ID;
                }
            }
        });
        botoVolver.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                if (!alphaBotonsIn && !alphaBotonsOut) {
                    alphaBotonsOut = true;
                    cambioA = EstatMenuPrincipal.ID;
                }
            }
        });
    }

    /**
     * El motor s'encarrega de cridar aquest metode, aqui s'actualitzaran dades de variables o objectes
     * que s'estiguin usant en aquest estat
     * @param container
     * @param game
     * @param delta
     * @throws SlickException
     */
    public void update(GameContainer game, StateBasedGame state, int delta) {
        // Si s'esta entrant a l'estat o se n'esta sortint es dura a terme
        // l'efecte de transparencia
        if (alphaBotonsIn) {
            comptador += 50;
            if (comptador % 100 == 0) {
                // Els botons es van tornant menys transparents
                transparencia += 0.05;
            }
            if (transparencia >= 1) {
                // Quan els botons ja no son transaprents s'activen
                //ReproductorMusica.setVolumMusic();
                //ReproductorMusica.last();
                botoJugar.setActiu(true);
                botoAvioMes.setActiu(true);
                botoAvioMenys.setActiu(true);
                botoVolver.setActiu(true);
                alphaBotonsIn = false;
                comptador = 0;
            }
        } else if (alphaBotonsOut) {
            // Quan els botons es tornen transparents es desactiven
            botoJugar.setActiu(false);
            botoAvioMes.setActiu(false);
            botoAvioMenys.setActiu(false);
            botoVolver.setActiu(false);
            comptador += 50;
            if (comptador % 100 == 0) {
                transparencia -= 0.05;
            }
            // Quan la transparencia arriba a 0 s'accedeix al seguent estat
            if (transparencia <= 0) {
                state.enterState(cambioA);
            }
        }
        //ReproductorMusica.update(container);
    }

    /**
     * Aquest metode s'usa per renderitzar o dibuixar en pantalla els elements que es vulguin
     * @param container
     * @param game
     * @param
     * @throws SlickException
     */
    public void render(GameContainer game, StateBasedGame state, Graphics g) {
        if (idioma == 1) {
            imatgeFons.draw(0,0);
        } else if (idioma == 2) {
            imatgeFonsCat.draw(0,0);
        } else if (idioma == 3) {
            imatgeFonsEng.draw(0,0);
        }
        //imatgeTitol.draw(290,100);
        imatgeBotoNormal.setAlpha(transparencia);
        imatgeBotoOver.setAlpha(transparencia);
       //imatgeBotoPlay.setAlpha(transparencia);
        //imatgeBotoOverPlay.setAlpha(transparencia);
        imatgeTextJugar.setAlpha(transparencia);
        imatgeTextSiguiente.setAlpha(transparencia);
        imatgeTextAnterior.setAlpha(transparencia);
        imatgeTextVolver.setAlpha(transparencia);
        botoJugar.render(container, g);
        botoAvioMes.render(container, g);
        botoAvioMenys.render(container, g);
        botoVolver.render(container, g);
    }

    /**
     * Es fa un override del metode enter, el qual es crida cada vegada que s'entra a l'estat
     * @param gc : context on es situa l'estat actual
     * @param state : estat actual
     */
    @Override
    public void enter(GameContainer gc, StateBasedGame state) {
        idioma = ManagerPerfil.getIdioma();
        reiniciarVariables();
        crearBotonsMenuNormal();
        afegirListeners();
        alphaBotonsIn = true;
    }

    /**
     * Es fa un override del metode leave, el qual es crida cada vegada que es surt de l'estat
     * @param gc
     * @param state
     */
    @Override
    public void leave(GameContainer gc, StateBasedGame state) {
        alphaBotonsOut = false;
        imatgeBotoNormal.setAlpha(1f);
        imatgeBotoOver.setAlpha(1f);
        imatgeTextJugar.setAlpha(1f);
        imatgeTextSiguiente.setAlpha(1f);
        imatgeTextAnterior.setAlpha(1f);
        imatgeTextVolver.setAlpha(1f);
        //imatgeBotoPlay.setAlpha(1f);
        //imatgeBotoOverPlay.setAlpha(1f);
        comptador = 0;
    }
}